package com.quyunshuo.module.home.view

import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.RectF
import android.util.AttributeSet
import android.util.Log
import android.view.View
import com.quyunshuo.androidbaseframemvvm.common.ext.px
import com.quyunshuo.module.home.R

// 定义图片宽度为200dp（通过扩展属性转换为像素）
val IMAGE_WIDTH = 200f.px
// 定义图片内边距为20dp（转换为像素）
val IMAGE_PADDING = 20f.px

/**
 * 将图片变成圆形。
 */
class Myview(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    // 创建抗锯齿画笔
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)

    private val TAG = "Myview"

    // 定义绘制区域矩形（左、上、右、下坐标）
    private val bounds = RectF(
        IMAGE_PADDING,//同你的图片一样
        IMAGE_PADDING,
        IMAGE_PADDING + IMAGE_WIDTH,//为什么加边距，肯定要加压，你左都加了。
        IMAGE_PADDING + IMAGE_WIDTH
    )

    override fun onDraw(canvas: Canvas) {
        // 保存当前画布状态，并创建离屏图层（用于实现混合效果）
        val count = canvas.saveLayer(bounds, null)

        // 绘制椭圆作为蒙版（最终只显示与该椭圆重叠的图片部分）
        canvas.drawOval(
            IMAGE_PADDING,
            IMAGE_PADDING,
            IMAGE_PADDING + IMAGE_WIDTH,
            IMAGE_PADDING + IMAGE_WIDTH,
            paint
        )

        // 设置混合模式：SRC_IN 表示只保留源图像与目标图像重叠的部分
        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)

        // region Bitmap解码配置
        val options = BitmapFactory.Options().apply {
            // 第一阶段：仅解码图片尺寸信息（不分配内存）
            inJustDecodeBounds = true
            BitmapFactory.decodeResource(resources, R.drawable.test2, this)

            // 潜在问题：inDensity应表示资源原始密度（例如160dpi），而不是宽度
            inDensity = outWidth  // ❌ 错误用法！应该使用资源对应的dpi值

            // 潜在问题：inTargetDensity应表示目标屏幕密度，而不是像素宽度
            inTargetDensity = IMAGE_WIDTH.toInt()  // ❌ 错误用法！应使用displayMetrics.densityDpi

            // 第二阶段：实际解码图片
            inJustDecodeBounds = false
        }
        // endregion

        // 解码位图资源（可能因上述错误配置返回null）
        val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test2, options)
        Log.d(TAG, "Decoded bitmap: $bitmap")

        // 绘制位图（如果bitmap为null会导致崩溃）
        bitmap?.let {
            canvas.drawBitmap(
                it,
                IMAGE_PADDING,//左
                IMAGE_PADDING,//上
                paint
            )
        } ?: run {
            Log.e(TAG, "Bitmap decoding failed!")
        }

        // 重置混合模式
        paint.xfermode = null
        // 恢复画布状态
        canvas.restoreToCount(count)
    }
}